--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / networkVisualiserPerf.js
Displaying Raw • Download
meshchatx/src/frontend/js/networkVisualiserPerf.js e0f1f99cd1c208c5008a936230c38e448dddd45d (e0f1f99c) Text, 17.17 KB
T8b949e// SPDX-License-Identifier: 0BSD AND MIT
T8b949e/**
* Network visualiser hot-path helpers.
* Prefers Go WASM when available, otherwise uses the pure JS implementations below.
*/
Tff7b72import Tb4b4b4{ Te6edf3callVisualiserWasmJsonTb4b4b4, Te6edf3isVisualiserWasmReadyTb4b4b4, Te6edf3preloadVisualiserWasm Tb4b4b4} Tff7b72from Ta5d6ff"./VisualiserWasmLoader.js"Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3VIZ_ANNOUNCE_ASPECTS Tff7b72= Tb4b4b4[Ta5d6ff"lxmf.delivery"Tb4b4b4, Ta5d6ff"nomadnetwork.node"Tb4b4b4]Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3ANNOUNCE_HASH_CHUNK_SIZE Tff7b72= T79c0ff500Tb4b4b4;
T8b949e/** Soft cap for client-side path table rows kept in the visualiser. */
Tff7b72export Tff7b72const Te6edf3VIZ_PATH_TABLE_SOFT_CAP Tff7b72= T79c0ff20Te6edf3_000Tb4b4b4;
T8b949e/** Soft cap for announce map entries keyed by destination hash. */
Tff7b72export Tff7b72const Te6edf3VIZ_ANNOUNCE_SOFT_CAP Tff7b72= T79c0ff10Te6edf3_000Tb4b4b4;
T8b949e/**
* @param {unknown[]} pathTable
* @param {number|null|undefined} hopMax
* @returns {string[]}
*/
Tff7b72export Tff7b72function Te6edf3pathHashesWithinHopFilterJsTb4b4b4(Te6edf3pathTableTb4b4b4, Te6edf3hopMaxTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3pathTableTb4b4b4) Tff7b72|| Te6edf3pathTableTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3out Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3entry Tff7b72of Te6edf3pathTableTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3entry Tff7b72|| Tff7b72typeof Te6edf3entry Tff7b72!== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3hops Tff7b72= Te6edf3entryTb4b4b4.Te6edf3hopsTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hops Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3hopMax Tff7b72!= Tff7b72null Tff7b72&& Te6edf3hops Tff7b72> Te6edf3hopMaxTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3hash Tff7b72= Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3hash Tff7b72=== Ta5d6ff"string" Tff7b72&& Te6edf3hashTb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3addTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Te6edf3outTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {unknown[]} pathTable
* @param {number|null|undefined} hopMax
* @returns {string[]}
*/
Tff7b72export Tff7b72function Te6edf3pathHashesWithinHopFilterTb4b4b4(Te6edf3pathTableTb4b4b4, Te6edf3hopMaxTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isVisualiserWasmReadyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3got Tff7b72= Te6edf3callVisualiserWasmJsonTb4b4b4(
Ta5d6ff"meshchatxVisualiserPathHashes"Tb4b4b4,
Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3pathTableTb4b4b4)Tb4b4b4,
Te6edf3hopMax Tff7b72== Tff7b72null Tff7b72? Tff7b72null Tff7b72: Te6edf3hopMax
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3gotTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3gotTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3pathHashesWithinHopFilterJsTb4b4b4(Te6edf3pathTableTb4b4b4, Te6edf3hopMaxTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Collapse deferred icon work so each unique cacheKey is painted once.
* @param {unknown[]} queue
* @returns {{ cacheKey: string, nodeIds: string[], iconName: string, fg: string, bg: string, size: number, generation: number }[]}
*/
Tff7b72export Tff7b72function Te6edf3dedupeIconQueueEntriesJsTb4b4b4(Te6edf3queueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3queueTb4b4b4) Tff7b72|| Te6edf3queueTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3byKey Tff7b72= Tff7b72new Tffa657MapTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3seenByKey Tff7b72= Tff7b72new Tffa657MapTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3item Tff7b72of Te6edf3queueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3item Tff7b72|| Tff7b72typeof Te6edf3item Tff7b72!== Ta5d6ff"object" Tff7b72|| Tff7b72!Te6edf3itemTb4b4b4.Te6edf3cacheKey Tff7b72|| Tff7b72!Te6edf3itemTb4b4b4.Te6edf3nodeIdTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3bucket Tff7b72= Te6edf3byKeyTb4b4b4.Te6edf3getTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3cacheKeyTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3bucketTb4b4b4) Tb4b4b4{
Te6edf3bucket Tff7b72= Tb4b4b4{
Te6edf3cacheKeyTff7b72: Te6edf3itemTb4b4b4.Te6edf3cacheKeyTb4b4b4,
Te6edf3nodeIdsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3iconNameTff7b72: Te6edf3itemTb4b4b4.Te6edf3iconNameTb4b4b4,
Te6edf3fgTff7b72: Te6edf3itemTb4b4b4.Te6edf3fgTb4b4b4,
Te6edf3bgTff7b72: Te6edf3itemTb4b4b4.Te6edf3bgTb4b4b4,
Te6edf3sizeTff7b72: Te6edf3itemTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3generationTff7b72: Te6edf3itemTb4b4b4.Te6edf3generationTb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3byKeyTb4b4b4.Te6edf3setTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3cacheKeyTb4b4b4, Te6edf3bucketTb4b4b4)Tb4b4b4;
Te6edf3seenByKeyTb4b4b4.Te6edf3setTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3cacheKeyTb4b4b4, Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3seen Tff7b72= Te6edf3seenByKeyTb4b4b4.Te6edf3getTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3cacheKeyTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3seenTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3nodeIdTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3seenTb4b4b4.Te6edf3addTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3nodeIdTb4b4b4)Tb4b4b4;
Te6edf3bucketTb4b4b4.Te6edf3nodeIdsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3nodeIdTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Te6edf3byKeyTb4b4b4.Te6edf3valuesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {unknown[]} queue
* @returns {{ cacheKey: string, nodeIds: string[], iconName: string, fg: string, bg: string, size: number, generation: number }[]}
*/
Tff7b72export Tff7b72function Te6edf3dedupeIconQueueEntriesTb4b4b4(Te6edf3queueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isVisualiserWasmReadyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3got Tff7b72= Te6edf3callVisualiserWasmJsonTb4b4b4(Ta5d6ff"meshchatxVisualiserDedupeIcons"Tb4b4b4, Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3queueTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3gotTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3gotTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3dedupeIconQueueEntriesJsTb4b4b4(Te6edf3queueTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Parallel path/announce fetch concurrency scaled to hardware.
* @returns {number}
*/
Tff7b72export Tff7b72function Te6edf3pickAdaptiveFetchConcurrencyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3cores Tff7b72= Tb4b4b4(Tff7b72typeof Te6edf3navigator Tff7b72!== Ta5d6ff"undefined" Tff7b72&& Te6edf3navigatorTb4b4b4.Te6edf3hardwareConcurrencyTb4b4b4) Tff7b72|| T79c0ff4Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cores Tff7b72<= T79c0ff2Tb4b4b4) Tff7b72return T79c0ff2Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cores Tff7b72<= T79c0ff4Tb4b4b4) Tff7b72return T79c0ff3Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cores Tff7b72<= T79c0ff6Tb4b4b4) Tff7b72return T79c0ff4Tb4b4b4;
Tff7b72return T79c0ff6Tb4b4b4;
Tb4b4b4}
T8b949e/** FNV-1a style deterministic unit fraction for stable layout without Math.random. */
Tff7b72function Te6edf3hash01Tb4b4b4(Te6edf3idTb4b4b4, Te6edf3salt Tff7b72= Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3h Tff7b72= T79c0ff2166136261Tb4b4b4;
Tff7b72const Te6edf3s Tff7b72= Tffa657StringTb4b4b4(Te6edf3idTb4b4b4) Tff7b72+ Ta5d6ff"\0" Tff7b72+ Tffa657StringTb4b4b4(Te6edf3saltTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3h Tff7b72^= Te6edf3sTb4b4b4.Te6edf3charCodeAtTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Te6edf3h Tff7b72= Tffa657MathTb4b4b4.Te6edf3imulTb4b4b4(Te6edf3hTb4b4b4, T79c0ff16777619Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4(Tb4b4b4(Te6edf3h Tff7b72>>> T79c0ff0Tb4b4b4) Tff7b72% T79c0ff10000Tb4b4b4) Tff7b72/ T79c0ff10000Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3hashAngleTb4b4b4(Te6edf3idTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3hash01Tb4b4b4(Te6edf3idTb4b4b4) Tff7b72* Tffa657MathTb4b4b4.Te6edf3PI Tff7b72* T79c0ff2Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3nodeColorTb4b4b4(Te6edf3borderTb4b4b4, Te6edf3backgroundTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3borderTb4b4b4,
Te6edf3backgroundTb4b4b4,
Te6edf3highlightTff7b72: Tb4b4b4{ Te6edf3borderTb4b4b4, Te6edf3background Tb4b4b4}Tb4b4b4,
Te6edf3hoverTff7b72: Tb4b4b4{ Te6edf3borderTb4b4b4, Te6edf3background Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3edgeColorTb4b4b4(Te6edf3directTb4b4b4, Te6edf3darkModeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3directTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3colorTff7b72: Te6edf3darkMode Tff7b72? Ta5d6ff"#34d399" Tff7b72: Ta5d6ff"#10b981"Tb4b4b4, Te6edf3opacityTff7b72: T79c0ff1 Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{ Te6edf3colorTff7b72: Te6edf3darkMode Tff7b72? Ta5d6ff"#60a5fa" Tff7b72: Ta5d6ff"#3b82f6"Tb4b4b4, Te6edf3opacityTff7b72: T79c0ff0.5 Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3applyLodToAnnounceNodeTb4b4b4(Te6edf3nodeTb4b4b4, Te6edf3lodTb4b4b4, Te6edf3fontColorTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3lod Tff7b72=== Ta5d6ff"low"Tb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3shape Tff7b72= Ta5d6ff"dot"Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3size Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3id Tff7b72=== Ta5d6ff"me" Tff7b72? T79c0ff15 Tff7b72: T79c0ff10Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3font Tff7b72= Tb4b4b4{ Te6edf3sizeTff7b72: T79c0ff0 Tb4b4b4}Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3lod Tff7b72=== Ta5d6ff"medium"Tb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3shape Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3_originalShape Tff7b72|| Ta5d6ff"circularImage"Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3size Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3_originalSize Tff7b72|| T79c0ff25Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3font Tff7b72= Tb4b4b4{ Te6edf3sizeTff7b72: T79c0ff0 Tb4b4b4}Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3nodeTb4b4b4.Te6edf3shape Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3_originalShape Tff7b72|| Ta5d6ff"circularImage"Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3size Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3_originalSize Tff7b72|| T79c0ff25Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3font Tff7b72= Tb4b4b4{ Te6edf3sizeTff7b72: Te6edf3nodeTb4b4b4.Te6edf3id Tff7b72=== Ta5d6ff"me" Tff7b72? T79c0ff16 Tff7b72: T79c0ff11Tb4b4b4, Te6edf3colorTff7b72: Te6edf3fontColor Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Pure JS path-table graph builder (fallback when WASM is unavailable).
* @param {object} req
* @returns {{ nodes: object[], edges: object[], icon_queue: object[], processed_node_ids: string[], processed_edge_ids: string[] }}
*/
Tff7b72export Tff7b72function Te6edf3buildPathGraphJsTb4b4b4(Te6edf3reqTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3pathTable Tff7b72= Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3reqTff7b72?Tb4b4b4.Te6edf3path_tableTb4b4b4) Tff7b72? Te6edf3reqTb4b4b4.Te6edf3path_table Tff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3announces Tff7b72= Te6edf3reqTff7b72?Tb4b4b4.Te6edf3announces Tff7b72&& Tff7b72typeof Te6edf3reqTb4b4b4.Te6edf3announces Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3reqTb4b4b4.Te6edf3announces Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3conversations Tff7b72= Te6edf3reqTff7b72?Tb4b4b4.Te6edf3conversations Tff7b72&& Tff7b72typeof Te6edf3reqTb4b4b4.Te6edf3conversations Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3reqTb4b4b4.Te6edf3conversations Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3iconCache Tff7b72= Te6edf3reqTff7b72?Tb4b4b4.Te6edf3icon_cache Tff7b72&& Tff7b72typeof Te6edf3reqTb4b4b4.Te6edf3icon_cache Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3reqTb4b4b4.Te6edf3icon_cache Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3positions Tff7b72= Tb4b4b4{ Tb4b4b4...Tb4b4b4(Te6edf3reqTff7b72?Tb4b4b4.Te6edf3positions Tff7b72&& Tff7b72typeof Te6edf3reqTb4b4b4.Te6edf3positions Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3reqTb4b4b4.Te6edf3positions Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3hopMax Tff7b72= Te6edf3reqTff7b72?Tb4b4b4.Te6edf3hop_maxTb4b4b4;
Tff7b72const Te6edf3searchLower Tff7b72= Tffa657StringTb4b4b4(Te6edf3reqTff7b72?Tb4b4b4.Te6edf3search Tff7b72|| Ta5d6ff""Tb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3darkMode Tff7b72= Tff7b72!Tff7b72!Te6edf3reqTff7b72?Tb4b4b4.Te6edf3dark_modeTb4b4b4;
Tff7b72const Te6edf3lod Tff7b72= Te6edf3reqTff7b72?Tb4b4b4.Te6edf3lod Tff7b72|| Ta5d6ff"high"Tb4b4b4;
Tff7b72const Te6edf3aspects Tff7b72= Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3reqTff7b72?Tb4b4b4.Te6edf3aspectsTb4b4b4) Tff7b72&& Te6edf3reqTb4b4b4.Te6edf3aspectsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0 Tff7b72? Te6edf3reqTb4b4b4.Te6edf3aspects Tff7b72: Te6edf3VIZ_ANNOUNCE_ASPECTSTb4b4b4;
Tff7b72const Te6edf3aspectSet Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Te6edf3aspectsTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3queueIcons Tff7b72= Tff7b72!Tff7b72!Te6edf3reqTff7b72?Tb4b4b4.Te6edf3queue_iconsTb4b4b4;
Tff7b72const Te6edf3iconGeneration Tff7b72= Te6edf3reqTff7b72?Tb4b4b4.Te6edf3icon_generation Tff7b72|| T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3fontColor Tff7b72= Te6edf3darkMode Tff7b72? Ta5d6ff"#ffffff" Tff7b72: Ta5d6ff"#000000"Tb4b4b4;
Tff7b72const Te6edf3matchesSearch Tff7b72= Tb4b4b4(Te6edf3textTb4b4b4) Tb4b4b4=> Tff7b72!Te6edf3searchLower Tff7b72|| Tb4b4b4(Te6edf3text Tff7b72&& Tffa657StringTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3searchLowerTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3nodes Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3edges Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3iconQueue Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3processedNodeIds Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3processedEdgeIds Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3entry Tff7b72of Te6edf3pathTableTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3entry Tff7b72|| Te6edf3entryTb4b4b4.Te6edf3hops Tff7b72== Tff7b72null Tff7b72|| Tff7b72!Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hopMax Tff7b72!= Tff7b72null Tff7b72&& Te6edf3entryTb4b4b4.Te6edf3hops Tff7b72> Te6edf3hopMaxTb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72const Te6edf3announce Tff7b72= Te6edf3announcesTb4b4b4[Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3announce Tff7b72|| Tff7b72!Te6edf3aspectSetTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3announceTb4b4b4.Te6edf3aspectTb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72const Te6edf3displayName Tff7b72= Te6edf3announceTb4b4b4.Te6edf3custom_display_name Tff7b72?? Te6edf3announceTb4b4b4.Te6edf3display_nameTb4b4b4;
Tff7b72if Tb4b4b4(
Tff7b72!Te6edf3matchesSearchTb4b4b4(Te6edf3displayNameTb4b4b4) Tff7b72&&
Tff7b72!Te6edf3matchesSearchTb4b4b4(Te6edf3announceTb4b4b4.Te6edf3destination_hashTb4b4b4) Tff7b72&&
Tff7b72!Te6edf3matchesSearchTb4b4b4(Te6edf3announceTb4b4b4.Te6edf3identity_hashTb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3xTb4b4b4;
Tff7b72let Te6edf3yTb4b4b4;
Tff7b72const Te6edf3prev Tff7b72= Te6edf3positionsTb4b4b4[Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3prev Tff7b72&& Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3prevTb4b4b4.Te6edf3xTb4b4b4) Tff7b72&& Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3prevTb4b4b4.Te6edf3yTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3x Tff7b72= Te6edf3prevTb4b4b4.Te6edf3xTb4b4b4;
Te6edf3y Tff7b72= Te6edf3prevTb4b4b4.Te6edf3yTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72const Te6edf3ip Tff7b72= Te6edf3positionsTb4b4b4[Te6edf3entryTb4b4b4.Tff7b72interfaceTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3angle Tff7b72= Te6edf3hashAngleTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ip Tff7b72&& Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3ipTb4b4b4.Te6edf3xTb4b4b4) Tff7b72&& Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3ipTb4b4b4.Te6edf3yTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3dist Tff7b72= T79c0ff150 Tff7b72+ Te6edf3hash01Tb4b4b4(Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4, Ta5d6ff"r"Tb4b4b4) Tff7b72* T79c0ff150Tb4b4b4;
Te6edf3x Tff7b72= Te6edf3ipTb4b4b4.Te6edf3x Tff7b72+ Tffa657MathTb4b4b4.Te6edf3cosTb4b4b4(Te6edf3angleTb4b4b4) Tff7b72* Te6edf3distTb4b4b4;
Te6edf3y Tff7b72= Te6edf3ipTb4b4b4.Te6edf3y Tff7b72+ Tffa657MathTb4b4b4.Te6edf3sinTb4b4b4(Te6edf3angleTb4b4b4) Tff7b72* Te6edf3distTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72const Te6edf3dist Tff7b72= T79c0ff600 Tff7b72+ Te6edf3hash01Tb4b4b4(Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4, Ta5d6ff"r"Tb4b4b4) Tff7b72* T79c0ff200Tb4b4b4;
Te6edf3x Tff7b72= Tffa657MathTb4b4b4.Te6edf3cosTb4b4b4(Te6edf3angleTb4b4b4) Tff7b72* Te6edf3distTb4b4b4;
Te6edf3y Tff7b72= Tffa657MathTb4b4b4.Te6edf3sinTb4b4b4(Te6edf3angleTb4b4b4) Tff7b72* Te6edf3distTb4b4b4;
Tb4b4b4}
Te6edf3positionsTb4b4b4[Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4] Tff7b72= Tb4b4b4{ Te6edf3xTb4b4b4, Te6edf3y Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3edgeId Tff7b72= Ta5d6ff`Tffd700${Te6edf3entryTb4b4b4.Tff7b72interfaceTffd700}Ta5d6ff~Tffd700${Te6edf3entryTb4b4b4.Te6edf3hashTffd700}Ta5d6ff`Tb4b4b4;
Tff7b72const Te6edf3direct Tff7b72= Te6edf3entryTb4b4b4.Te6edf3hops Tff7b72=== T79c0ff1Tb4b4b4;
Tff7b72const Te6edf3conversation Tff7b72= Te6edf3conversationsTb4b4b4[Te6edf3announceTb4b4b4.Te6edf3destination_hashTb4b4b4]Tb4b4b4;
Tff7b72let Te6edf3node Tff7b72= Tb4b4b4{
Te6edf3idTff7b72: Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4,
Te6edf3groupTff7b72: Ta5d6ff"announce"Tb4b4b4,
Te6edf3sizeTff7b72: T79c0ff25Tb4b4b4,
Te6edf3_originalSizeTff7b72: T79c0ff25Tb4b4b4,
Te6edf3fontTff7b72: Tb4b4b4{ Te6edf3colorTff7b72: Te6edf3fontColorTb4b4b4, Te6edf3sizeTff7b72: T79c0ff11 Tb4b4b4}Tb4b4b4,
Te6edf3xTb4b4b4,
Te6edf3yTb4b4b4,
Te6edf3labelTff7b72: Te6edf3displayNameTb4b4b4,
Te6edf3titleTff7b72: Ta5d6ff`Tffd700${Te6edf3displayNameTffd700}Ta5d6ff\nTa5d6ffAspect: Tffd700${Te6edf3announceTb4b4b4.Te6edf3aspectTffd700}Ta5d6ff\nTa5d6ffHops: Tffd700${Te6edf3entryTb4b4b4.Te6edf3hopsTffd700}Ta5d6ff\nTa5d6ffVia: Tffd700${Te6edf3entryTb4b4b4.Tff7b72interfaceTffd700}Ta5d6ff\nTa5d6ffLast Seen: Tffd700${Te6edf3announceTb4b4b4.Te6edf3last_seen Tff7b72|| Ta5d6ff""Tffd700}Ta5d6ff`Tb4b4b4,
Te6edf3_parentInterfaceTff7b72: Te6edf3entryTb4b4b4.Tff7b72interfaceTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3announceTb4b4b4.Te6edf3aspect Tff7b72=== Ta5d6ff"lxmf.delivery"Tb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3shape Tff7b72= Ta5d6ff"circularImage"Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3_originalShape Tff7b72= Ta5d6ff"circularImage"Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3conversationTff7b72?Tb4b4b4.Te6edf3lxmf_user_iconTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3ic Tff7b72= Te6edf3conversationTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4;
Tff7b72const Te6edf3cacheKey Tff7b72= Ta5d6ff`Tffd700${Te6edf3icTb4b4b4.Te6edf3icon_nameTffd700}Ta5d6ff-Tffd700${Te6edf3icTb4b4b4.Te6edf3foreground_colourTffd700}Ta5d6ff-Tffd700${Te6edf3icTb4b4b4.Te6edf3background_colourTffd700}Ta5d6ff-64Ta5d6ff`Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3iconCacheTb4b4b4[Te6edf3cacheKeyTb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3image Tff7b72= Te6edf3iconCacheTb4b4b4[Te6edf3cacheKeyTb4b4b4]Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3image Tff7b72= Te6edf3direct
Tff7b72? Ta5d6ff"/assets/images/network-visualiser/user_1hop.png"
Tff7b72: Ta5d6ff"/assets/images/network-visualiser/user.png"Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3queueIconsTb4b4b4) Tb4b4b4{
Te6edf3iconQueueTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nodeIdTff7b72: Te6edf3nodeTb4b4b4.Te6edf3idTb4b4b4,
Te6edf3cacheKeyTb4b4b4,
Te6edf3iconNameTff7b72: Te6edf3icTb4b4b4.Te6edf3icon_nameTb4b4b4,
Te6edf3fgTff7b72: Te6edf3icTb4b4b4.Te6edf3foreground_colourTb4b4b4,
Te6edf3bgTff7b72: Te6edf3icTb4b4b4.Te6edf3background_colourTb4b4b4,
Te6edf3sizeTff7b72: T79c0ff64Tb4b4b4,
Te6edf3generationTff7b72: Te6edf3iconGenerationTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3nodeTb4b4b4.Te6edf3size Tff7b72= T79c0ff30Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3_originalSize Tff7b72= T79c0ff30Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3image Tff7b72= Te6edf3direct
Tff7b72? Ta5d6ff"/assets/images/network-visualiser/user_1hop.png"
Tff7b72: Ta5d6ff"/assets/images/network-visualiser/user.png"Tb4b4b4;
Tb4b4b4}
Te6edf3nodeTb4b4b4.Te6edf3color Tff7b72= Te6edf3nodeColorTb4b4b4(
Te6edf3direct Tff7b72? Ta5d6ff"#10b981" Tff7b72: Ta5d6ff"#3b82f6"Tb4b4b4,
Te6edf3direct Tff7b72? Tb4b4b4(Te6edf3darkMode Tff7b72? Ta5d6ff"#064e3b" Tff7b72: Ta5d6ff"#ecfdf5"Tb4b4b4) Tff7b72: Te6edf3darkMode Tff7b72? Ta5d6ff"#1e40af" Tff7b72: Ta5d6ff"#eff6ff"
Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3announceTb4b4b4.Te6edf3aspect Tff7b72=== Ta5d6ff"nomadnetwork.node"Tb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3shape Tff7b72= Ta5d6ff"circularImage"Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3_originalShape Tff7b72= Ta5d6ff"circularImage"Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3image Tff7b72= Te6edf3direct
Tff7b72? Ta5d6ff"/assets/images/network-visualiser/server_1hop.png"
Tff7b72: Ta5d6ff"/assets/images/network-visualiser/server.png"Tb4b4b4;
Te6edf3nodeTb4b4b4.Te6edf3color Tff7b72= Te6edf3nodeColorTb4b4b4(
Te6edf3direct Tff7b72? Ta5d6ff"#10b981" Tff7b72: Ta5d6ff"#8b5cf6"Tb4b4b4,
Te6edf3direct Tff7b72? Tb4b4b4(Te6edf3darkMode Tff7b72? Ta5d6ff"#064e3b" Tff7b72: Ta5d6ff"#ecfdf5"Tb4b4b4) Tff7b72: Te6edf3darkMode Tff7b72? Ta5d6ff"#4c1d95" Tff7b72: Ta5d6ff"#f5f3ff"
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3applyLodToAnnounceNodeTb4b4b4(Te6edf3nodeTb4b4b4, Te6edf3lodTb4b4b4, Te6edf3fontColorTb4b4b4)Tb4b4b4;
Te6edf3nodesTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3nodeTb4b4b4)Tb4b4b4;
Te6edf3processedNodeIdsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4;
Te6edf3edgesTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3idTff7b72: Te6edf3edgeIdTb4b4b4,
Tff7b72fromTff7b72: Te6edf3entryTb4b4b4.Tff7b72interfaceTb4b4b4,
Te6edf3toTff7b72: Te6edf3entryTb4b4b4.Te6edf3hashTb4b4b4,
Te6edf3colorTff7b72: Te6edf3edgeColorTb4b4b4(Te6edf3directTb4b4b4, Te6edf3darkModeTb4b4b4)Tb4b4b4,
Te6edf3widthTff7b72: Te6edf3direct Tff7b72? T79c0ff2.5 Tff7b72: T79c0ff1Tb4b4b4,
Te6edf3hiddenTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3processedEdgeIdsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3edgeIdTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3nodesTb4b4b4,
Te6edf3edgesTb4b4b4,
Te6edf3icon_queueTff7b72: Te6edf3iconQueueTb4b4b4,
Te6edf3processed_node_idsTff7b72: Te6edf3processedNodeIdsTb4b4b4,
Te6edf3processed_edge_idsTff7b72: Te6edf3processedEdgeIdsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Build announce nodes/edges from the path table via WASM or JS fallback.
* @param {object} req
*/
Tff7b72export Tff7b72function Te6edf3buildPathGraphTb4b4b4(Te6edf3reqTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isVisualiserWasmReadyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3got Tff7b72= Te6edf3callVisualiserWasmJsonTb4b4b4(Ta5d6ff"meshchatxVisualiserBuildPathGraph"Tb4b4b4, Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3got Tff7b72&& Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3gotTb4b4b4.Te6edf3nodesTb4b4b4) Tff7b72&& Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3gotTb4b4b4.Te6edf3edgesTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3gotTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3buildPathGraphJsTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Full mesh graph (me + interfaces + discovered + announces) via WASM or JS.
* @param {object} req
*/
Tff7b72export Tff7b72function Te6edf3buildFullGraphTb4b4b4(Te6edf3reqTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isVisualiserWasmReadyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3got Tff7b72= Te6edf3callVisualiserWasmJsonTb4b4b4(Ta5d6ff"meshchatxVisualiserBuildFullGraph"Tb4b4b4, Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3got Tff7b72&& Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3gotTb4b4b4.Te6edf3nodesTb4b4b4) Tff7b72&& Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3gotTb4b4b4.Te6edf3edgesTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3gotTb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// Fallback: path graph only, caller still builds me/ifaces in Vue for older paths.
Tff7b72const Te6edf3path Tff7b72= Te6edf3buildPathGraphJsTb4b4b4(Tb4b4b4{
Te6edf3path_tableTff7b72: Te6edf3reqTb4b4b4.Te6edf3path_tableTb4b4b4,
Te6edf3announcesTff7b72: Te6edf3reqTb4b4b4.Te6edf3announcesTb4b4b4,
Te6edf3conversationsTff7b72: Te6edf3reqTb4b4b4.Te6edf3conversationsTb4b4b4,
Te6edf3icon_cacheTff7b72: Te6edf3reqTb4b4b4.Te6edf3icon_cacheTb4b4b4,
Te6edf3positionsTff7b72: Te6edf3reqTb4b4b4.Te6edf3positionsTb4b4b4,
Te6edf3hop_maxTff7b72: Te6edf3reqTb4b4b4.Te6edf3hop_maxTb4b4b4,
Te6edf3searchTff7b72: Te6edf3reqTb4b4b4.Te6edf3searchTb4b4b4,
Te6edf3dark_modeTff7b72: Te6edf3reqTb4b4b4.Te6edf3dark_modeTb4b4b4,
Te6edf3lodTff7b72: Te6edf3reqTb4b4b4.Te6edf3lodTb4b4b4,
Te6edf3aspectsTff7b72: Te6edf3reqTb4b4b4.Te6edf3aspectsTb4b4b4,
Te6edf3queue_iconsTff7b72: Te6edf3reqTb4b4b4.Te6edf3queue_iconsTb4b4b4,
Te6edf3icon_generationTff7b72: Te6edf3reqTb4b4b4.Te6edf3icon_generationTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Tb4b4b4...Te6edf3pathTb4b4b4,
Te6edf3layout_nodesTff7b72: Tb4b4b4(Te6edf3pathTb4b4b4.Te6edf3nodes Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3nTb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{
Te6edf3idTff7b72: Te6edf3nTb4b4b4.Te6edf3idTb4b4b4,
Te6edf3xTff7b72: Te6edf3nTb4b4b4.Te6edf3xTb4b4b4,
Te6edf3yTff7b72: Te6edf3nTb4b4b4.Te6edf3yTb4b4b4,
Te6edf3massTff7b72: Te6edf3nTb4b4b4.Te6edf3group Tff7b72=== Ta5d6ff"me" Tff7b72? T79c0ff4 Tff7b72: Te6edf3nTb4b4b4.Te6edf3group Tff7b72=== Ta5d6ff"interface" Tff7b72? T79c0ff2.5 Tff7b72: T79c0ff1Tb4b4b4,
Te6edf3fixedTff7b72: Te6edf3nTb4b4b4.Te6edf3id Tff7b72=== Ta5d6ff"me"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3layout_edgesTff7b72: Tb4b4b4(Te6edf3pathTb4b4b4.Te6edf3edges Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{
Tff7b72fromTff7b72: Te6edf3eTb4b4b4.Tff7b72fromTb4b4b4,
Te6edf3toTff7b72: Te6edf3eTb4b4b4.Te6edf3toTb4b4b4,
Te6edf3lengthTff7b72: Te6edf3eTb4b4b4.Te6edf3width Tff7b72>= T79c0ff2 Tff7b72? T79c0ff260 Tff7b72: T79c0ff300Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Settle layout positions in WASM (or no-op passthrough when unavailable).
* @param {{ nodes: object[], edges: object[], iterations?: number }} req
*/
Tff7b72export Tff7b72function Te6edf3settleLayoutTb4b4b4(Te6edf3reqTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isVisualiserWasmReadyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3got Tff7b72= Te6edf3callVisualiserWasmJsonTb4b4b4(Ta5d6ff"meshchatxVisualiserLayout"Tb4b4b4, Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3got Tff7b72&& Te6edf3gotTb4b4b4.Te6edf3positions Tff7b72&& Tff7b72typeof Te6edf3gotTb4b4b4.Te6edf3positions Tff7b72=== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3gotTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72const Te6edf3positions Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3n Tff7b72of Te6edf3reqTff7b72?Tb4b4b4.Te6edf3nodes Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3nTff7b72?Tb4b4b4.Te6edf3idTb4b4b4) Te6edf3positionsTb4b4b4[Te6edf3nTb4b4b4.Te6edf3idTb4b4b4] Tff7b72= Tb4b4b4{ Te6edf3xTff7b72: Te6edf3nTb4b4b4.Te6edf3x Tff7b72|| T79c0ff0Tb4b4b4, Te6edf3yTff7b72: Te6edf3nTb4b4b4.Te6edf3y Tff7b72|| T79c0ff0 Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{ Te6edf3positionsTb4b4b4, Te6edf3iterationsTff7b72: T79c0ff0 Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {object[]} nodes
* @param {string} lod
* @param {boolean} darkMode
* @returns {object[]}
*/
Tff7b72export Tff7b72function Te6edf3computeLodUpdatesJsTb4b4b4(Te6edf3nodesTb4b4b4, Te6edf3lodTb4b4b4, Te6edf3darkModeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3nodesTb4b4b4) Tff7b72|| Te6edf3nodesTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3fontColor Tff7b72= Te6edf3darkMode Tff7b72? Ta5d6ff"#ffffff" Tff7b72: Ta5d6ff"#000000"Tb4b4b4;
Tff7b72const Te6edf3blueBorder Tff7b72= Ta5d6ff"#3b82f6"Tb4b4b4;
Tff7b72const Te6edf3blueBg Tff7b72= Te6edf3darkMode Tff7b72? Ta5d6ff"#1e40af" Tff7b72: Ta5d6ff"#eff6ff"Tb4b4b4;
Tff7b72const Te6edf3updates Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3node Tff7b72of Te6edf3nodesTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3node Tff7b72|| Tff7b72!Te6edf3nodeTb4b4b4.Te6edf3idTb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72let Te6edf3nextTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3lod Tff7b72=== Ta5d6ff"low"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3isInterface Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3group Tff7b72=== Ta5d6ff"interface"Tb4b4b4;
Tff7b72const Te6edf3baseColor Tff7b72= Te6edf3isInterface Tff7b72&& Te6edf3nodeTb4b4b4.Te6edf3color Tff7b72? Te6edf3nodeTb4b4b4.Te6edf3color Tff7b72: Te6edf3nodeColorTb4b4b4(Te6edf3blueBorderTb4b4b4, Te6edf3blueBgTb4b4b4)Tb4b4b4;
Te6edf3next Tff7b72= Tb4b4b4{
Te6edf3idTff7b72: Te6edf3nodeTb4b4b4.Te6edf3idTb4b4b4,
Te6edf3shapeTff7b72: Ta5d6ff"dot"Tb4b4b4,
Te6edf3sizeTff7b72: Te6edf3nodeTb4b4b4.Te6edf3id Tff7b72=== Ta5d6ff"me" Tff7b72? T79c0ff15 Tff7b72: T79c0ff10Tb4b4b4,
Te6edf3fontTff7b72: Tb4b4b4{ Te6edf3sizeTff7b72: T79c0ff0 Tb4b4b4}Tb4b4b4,
Te6edf3colorTff7b72: Te6edf3baseColorTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3lod Tff7b72=== Ta5d6ff"medium"Tb4b4b4) Tb4b4b4{
Te6edf3next Tff7b72= Tb4b4b4{
Te6edf3idTff7b72: Te6edf3nodeTb4b4b4.Te6edf3idTb4b4b4,
Te6edf3shapeTff7b72: Te6edf3nodeTb4b4b4.Te6edf3_originalShape Tff7b72|| Ta5d6ff"circularImage"Tb4b4b4,
Te6edf3sizeTff7b72: Te6edf3nodeTb4b4b4.Te6edf3_originalSize Tff7b72|| Tb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3id Tff7b72=== Ta5d6ff"me" Tff7b72? T79c0ff50 Tff7b72: T79c0ff25Tb4b4b4)Tb4b4b4,
Te6edf3fontTff7b72: Tb4b4b4{ Te6edf3sizeTff7b72: T79c0ff0 Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3next Tff7b72= Tb4b4b4{
Te6edf3idTff7b72: Te6edf3nodeTb4b4b4.Te6edf3idTb4b4b4,
Te6edf3shapeTff7b72: Te6edf3nodeTb4b4b4.Te6edf3_originalShape Tff7b72|| Ta5d6ff"circularImage"Tb4b4b4,
Te6edf3sizeTff7b72: Te6edf3nodeTb4b4b4.Te6edf3_originalSize Tff7b72|| Tb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3id Tff7b72=== Ta5d6ff"me" Tff7b72? T79c0ff50 Tff7b72: T79c0ff25Tb4b4b4)Tb4b4b4,
Te6edf3fontTff7b72: Tb4b4b4{ Te6edf3sizeTff7b72: Te6edf3nodeTb4b4b4.Te6edf3id Tff7b72=== Ta5d6ff"me" Tff7b72? T79c0ff16 Tff7b72: T79c0ff11Tb4b4b4, Te6edf3colorTff7b72: Te6edf3fontColor Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3shapeChanged Tff7b72= Te6edf3nextTb4b4b4.Te6edf3shape Tff7b72!= Tff7b72null Tff7b72&& Te6edf3nextTb4b4b4.Te6edf3shape Tff7b72!== Te6edf3nodeTb4b4b4.Te6edf3shapeTb4b4b4;
Tff7b72const Te6edf3sizeChanged Tff7b72= Te6edf3nextTb4b4b4.Te6edf3size Tff7b72!= Tff7b72null Tff7b72&& Te6edf3nextTb4b4b4.Te6edf3size Tff7b72!== Te6edf3nodeTb4b4b4.Te6edf3sizeTb4b4b4;
Tff7b72const Te6edf3fontSize Tff7b72= Te6edf3nextTb4b4b4.Te6edf3fontTff7b72?Tb4b4b4.Te6edf3sizeTb4b4b4;
Tff7b72const Te6edf3fontChanged Tff7b72= Te6edf3fontSize Tff7b72!= Tff7b72null Tff7b72&& Te6edf3fontSize Tff7b72!== Tb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3fontTff7b72?Tb4b4b4.Te6edf3size Tff7b72?? Tff7b72nullTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3shapeChanged Tff7b72|| Te6edf3sizeChanged Tff7b72|| Te6edf3fontChangedTb4b4b4) Tb4b4b4{
Te6edf3updatesTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3nextTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3updatesTb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {object[]} nodes
* @param {string} lod
* @param {boolean} darkMode
*/
Tff7b72export Tff7b72function Te6edf3computeLodUpdatesTb4b4b4(Te6edf3nodesTb4b4b4, Te6edf3lodTb4b4b4, Te6edf3darkModeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isVisualiserWasmReadyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3got Tff7b72= Te6edf3callVisualiserWasmJsonTb4b4b4(
Ta5d6ff"meshchatxVisualiserLODUpdates"Tb4b4b4,
Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Tb4b4b4{ Te6edf3nodesTb4b4b4, Te6edf3lodTb4b4b4, Te6edf3dark_modeTff7b72: Tff7b72!Tff7b72!Te6edf3darkMode Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3gotTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3gotTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3computeLodUpdatesJsTb4b4b4(Te6edf3nodesTb4b4b4, Te6edf3lodTb4b4b4, Te6edf3darkModeTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Map camera scale to LOD level (WASM when ready).
* @param {number} scale
* @returns {"low"|"medium"|"high"}
*/
Tff7b72export Tff7b72function Te6edf3lodLevelFromScaleTb4b4b4(Te6edf3scaleTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isVisualiserWasmReadyTb4b4b4(Tb4b4b4) Tff7b72&& Tff7b72typeof Tffa657globalThisTb4b4b4.Te6edf3meshchatxVisualiserLODLevel Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3v Tff7b72= Tffa657globalThisTb4b4b4.Te6edf3meshchatxVisualiserLODLevelTb4b4b4(Te6edf3scaleTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3v Tff7b72=== Ta5d6ff"low" Tff7b72|| Te6edf3v Tff7b72=== Ta5d6ff"medium" Tff7b72|| Te6edf3v Tff7b72=== Ta5d6ff"high"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3vTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e/* fall through */
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3scale Tff7b72< T79c0ff0.2Tb4b4b4) Tff7b72return Ta5d6ff"low"Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3scale Tff7b72< T79c0ff0.5Tb4b4b4) Tff7b72return Ta5d6ff"medium"Tb4b4b4;
Tff7b72return Ta5d6ff"high"Tb4b4b4;
Tb4b4b4}
T8b949e/** Warm the WASM module early. Safe to ignore the result. */
Tff7b72export Tff7b72function Te6edf3warmVisualiserWasmTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3preloadVisualiserWasmTb4b4b4(Tb4b4b4)Tb4b4b4.Tff7b72catchTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────